home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
telecomm
/
sticpsrc.lzh
/
SOURCE.ARC
/
ATARI_RF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-06-08
|
4KB
|
140 lines
/*
* In-memory resource file fixup routine.
* Copyright (C) 1987 by R.E. Janssen.
*
* Insert proper include filename and compile it as a separate module.
* Make sure the name of the external vars agrees with the main program.
*
* Call rsrc_fixup during init, before using the resource.
*
* The number of dirty type-conversions and recasts is really awful!!
*
*/
#include <gemstuff.h> /* everything we need to know about GEM */
#include "atari_rs.c" /* get resource definitions */
/*** GLOBAL VARIABLES FROM MAIN PROGRAM ***/
extern WORD gr_hhchar,gr_hwchar,gr_hhbox,gr_hwbox;/* system font sizes */
/*
* fixup the complete resource, as loaded with the includes
*
* this consists of:
* - changing indices to addresses (pointers)
* - converting units from characters to pixels
*
* dirty trick:
* any resource tree that's OUTLINED will be converted to screen
* resolution, others will get a standard conversion.
* this way, one can display icons in a window on all resolutions,
* and still get dialog boxes converted properly.
*/
#define fixsize(x,s,t) x = ((x & 0xff) * s + (x >> 8) / t)
void rsrc_fixup ()
{
register int i;
register OBJECT *object;
WORD xscale,yscale,ytrim; /* object scaling factor */
/* start converting all indices to addresses, type by type */
#if NUM_BB != 0
for (i = 0; i < NUM_BB; i++) /* put bitblock addresses */
rs_bitblk[i].bi_pdata = rs_imdope[(int) rs_bitblk[i].bi_pdata].image;
#endif
#if NUM_FRIMG != 0
for (i = 0; i < NUM_FRIMG; i++) /* put image addresses */
rs_frimg[i] = rs_imdope[(int) rs_frimg[i]].image;
#endif
#if NUM_IB != 0
for (i = 0; i < NUM_IB; i++) /* put icon addresses */
{
rs_iconblk[i].ib_pmask = rs_imdope[(int) rs_iconblk[i].ib_pmask].image;
rs_iconblk[i].ib_pdata = rs_imdope[(int) rs_iconblk[i].ib_pdata].image;
rs_iconblk[i].ib_ptext = rs_strings[(int) rs_iconblk[i].ib_ptext];
}
#endif
#if NUM_TI != 0
for (i = 0; i < NUM_TI; i++) /* tedinfo addresses */
{
rs_tedinfo[i].te_ptext = rs_strings[(int) rs_tedinfo[i].te_ptext];
rs_tedinfo[i].te_ptmplt = rs_strings[(int) rs_tedinfo[i].te_ptmplt];
rs_tedinfo[i].te_pvalid = rs_strings[(int) rs_tedinfo[i].te_pvalid];
}
#endif
#if NUM_OBS != 0
xscale = yscale = ytrim = 1; /* initial values - not used */
for (i = 0; i < NUM_OBS; i++) /* objects */
{
object = &rs_object[i]; /* get object address */
if (object->ob_next == NIL) /* root of a tree? */
{
if (object->ob_state & OUTLINED) /* is it outlined? */
{
xscale = gr_hwchar; /* set proper x scale */
yscale = gr_hhchar; /* same for y scale */
ytrim = 16 / yscale; /* compensate for bad scale */
}
else
{
/* use constants instead of gr_hxchar to get a nice picture */
/* on a color monitor (although it is bigger, it looks ok) */
xscale = 8;
yscale = 16;
ytrim = 1;
}
}
fixsize(object->ob_x,xscale,1); /* fix x position */
fixsize(object->ob_y,yscale,ytrim); /* same for y */
fixsize(object->ob_width,xscale,1); /* horizontal size */
fixsize(object->ob_height,yscale,ytrim); /* vertical size */
switch (object->ob_type) /* action depends on type */
{
case G_BUTTON: /* these use a string */
case G_STRING:
case G_TITLE:
object->ob_spec = rs_strings[(long) object->ob_spec];
break;
case G_IMAGE:
object->ob_spec = (char *) &rs_bitblk[(long) object->ob_spec];
break;
case G_ICON:
object->ob_spec = (char *) &rs_iconblk[(long) object->ob_spec];
break;
case G_TEXT: /* these all use a tedinfo */
case G_BOXTEXT:
case G_FTEXT:
case G_FBOXTEXT:
object->ob_spec = (char *) &rs_tedinfo[(long) object->ob_spec];
break;
}
}
#endif
#if NUM_TREE != 0
for (i = 0; i < NUM_TREE; i++) /* fix tree address */
rs_trindex[i] = (long) &rs_object[(int) rs_trindex[i]];
#endif
}